package Hash.Medium;

import java.util.Arrays;

public class LC1657 {
    /**
     * 根据提示1，操作1可以任意地对字符串进行重新排序。假如两个字符串出现过的字母一致，并且每个字母出现过的次数一致，那么无论怎么排列，
     * 都可以通过操作1使两个字符串内容相同。假设存在一个字母出现频率的直方图，那么上述条件等价于直方图相等。
     * 受到提示1的启发，操作2的效果是能够交换直方图中任意两个非0的项。于是问题的解法就变为了构建字幕出现频率的直方图，然后对直方图进行检查。
     */
    public boolean closeStrings(String word1, String word2) {
        int[] letterHash1 = new int[26], letterHash2 = new int[26];
        for (char c : word1.toCharArray()) {
            letterHash1[c - 'a']++;
        }
        for (char c : word2.toCharArray()) {
            letterHash2[c - 'a']++;
        }

        // 确保两个字符串中出现过的字母一致
        for (int i = 0; i < 26; i++) {
            if (letterHash1[i] > 0 && letterHash2[i] <= 0) return false;
            if (letterHash2[i] > 0 && letterHash1[i] <= 0) return false;
        }

        Arrays.sort(letterHash1);
        Arrays.sort(letterHash2);

        for (int i = 0; i < 26; i++) {
            if (letterHash1[i] != letterHash2[i]) return false;
        }
        return true;
    }
}
